﻿#ifndef CLogMng_H
#define CLogMng_H
/********************************************************************************
** @ Date:2025/10/14
** @ Author: HanJiaXin
** @ Description:日志管理单例类
** @ Version:1.0.0
** @ ClassName:CLogMng
** @ Fun:
********************************************************************************/
#include <QObject>
#include <QMutex>
#include <QVector>
#include <QColor>
#include <QMap>
#include <QDomElement>
#include <QPointer>
#include "Public.h"

class CLogWidget;

class CLogMng  : public QObject
{
	Q_OBJECT

public:

	static CLogMng& instance();
	
	void addMsg(const QString& sModuleName,const QString& sDeviceName,const QString& sFuncName,int nLevel,const QString& sLog);// 日志记录接口
	QWidget* createLogWidget(const QString& sModuleName, const QString& sDeviceName);//日志控件创建接口
	void destroyLogWidget(QWidget* widget);
	SLogLevelConfig getLogLevelConfig(int nLevel);
	void saveConfig();

private:
	// 私有构造函数和析构函数
	CLogMng();
	~CLogMng();

	// 禁用拷贝和赋值
	CLogMng(const CLogMng&) = delete;
	CLogMng& operator=(const CLogMng&) = delete;

	void init();
	void loadConfig();//加载Xml配置文件
	void createDefaultConfig();//创建默认的配置文件
	bool parseMainConfig(const QDomElement& element);//加载Main
	bool parseLogLevelConfig(const QDomElement& element);//加载LogLevel

	QString getLevelString(int nLevel) const;
	QString getLogFilePath(const QString& sModuleName,const QString& sDeviceName) const;//根据传入的模块名和设备名返回日志路径
	void ensureDirExists(const QString& path) const;//判断传入的绝对路径是否存在

	// 在头文件中添加
private slots:
	void processLogMsg(const QString& sModuleName, const QString& sDeviceName,
		const QString& sFuncName, int nLevel, const QString& sLog);

public:
	// 显示配置（从XML读取）
	bool m_isShowLimit = true;           // 是否设置条数上限
	int m_showLimit = 500;               // 显示条数上限
	bool m_showDescend = true;           // 显示顺序（true:倒序，false:正序）
	QColor m_tableGridColor = Qt::black; // 表格框线颜色
	QColor m_tableBackColor = Qt::white; // 表格背景颜色
	int m_autoClearType = 1;             // 自动清理类型
	double m_clearFreq = 24.0;           // 清理频率
	int m_clearRange = 180;              // 清理时限
	QMap<int, SLogLevelConfig> m_mapLogLevelConfigs; // 日志等级配置

private:
	QMutex m_writeMutex;
	QMutex m_widgetMutex;
	QVector< QPointer<CLogWidget>> m_vecLogWidget;//日志控件管理数组
	int m_minLogLevel = 0;
	qint64 m_maxFileSize = 10 * 1024 * 1024; // 10MB
};

#endif